{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 多变量线性回归\n",
    "\n",
    "## 场景\n",
    "根据房屋面积,卧室数量预测房屋价格\n",
    "## 数据文件\n",
    "ex1data2.txt\n",
    "## 依赖工具包导入\n"
   ],
   "id": "4b77c0c36d1a1cac"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.296683Z",
     "start_time": "2024-08-07T01:20:10.291986Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from tarfile import data_filter\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.core.pylabtools import figsize\n",
    "from pyparsing import alphas\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为宋体"
   ],
   "id": "6ae361093bbc24d6",
   "outputs": [],
   "execution_count": 144
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 数据导入",
   "id": "edc847dd341437b6"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.321091Z",
     "start_time": "2024-08-07T01:20:10.309891Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "data_file = 'data/ex1data2.txt'\n",
    "data = pd.read_csv(data_file,header=None,names=['面积','卧室数量','售价'])\n",
    "data.describe()"
   ],
   "id": "51df99274b929b13",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                面积       卧室数量             售价\n",
       "count    47.000000  47.000000      47.000000\n",
       "mean   2000.680851   3.170213  340412.659574\n",
       "std     794.702354   0.760982  125039.899586\n",
       "min     852.000000   1.000000  169900.000000\n",
       "25%    1432.000000   3.000000  249900.000000\n",
       "50%    1888.000000   3.000000  299900.000000\n",
       "75%    2269.000000   4.000000  384450.000000\n",
       "max    4478.000000   5.000000  699900.000000"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>面积</th>\n",
       "      <th>卧室数量</th>\n",
       "      <th>售价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>47.000000</td>\n",
       "      <td>47.000000</td>\n",
       "      <td>47.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2000.680851</td>\n",
       "      <td>3.170213</td>\n",
       "      <td>340412.659574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>794.702354</td>\n",
       "      <td>0.760982</td>\n",
       "      <td>125039.899586</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>852.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>169900.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1432.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>249900.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1888.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>299900.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2269.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>384450.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>4478.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>699900.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 145
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 模型\n",
    "   模型公式为： \n",
    "$$ f(x_1,x_2,...,x_n)= k_1x_1 +k_2x_2+...k_nx_n + b$$ \n",
    "其代价函数为:\n",
    "$$J\\left(k_1,k_2,k_3,...,k_n\\right)=\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{( {{f}}\\left({{x}_1^{(i)},{x}_2^{(i)},...,{x}_n^{(i)}} )-{{y}^{(i)}} \\right)}^{2}}}$$\n",
    "## 特征缩放\n",
    "#### 方法1 除以最大值\n",
    "原值处理最大值\n",
    "$$ \\frac{x}{max(x)}$$\n",
    "#### 方法2 均值正常化(平均归一化)\n",
    "原值减去平均数除以最大值减去最小值\n",
    "$$ \\frac{x-\\mu}{max(x)-min(x)}$$\n",
    "#### 方法3 分数归一化\n",
    "原值减去平均数处理标准差\n",
    "$$ \\frac{x-\\mu}{\\sigma} $$\n",
    "\n",
    "### 使用平均归一化进行处理数据\n"
   ],
   "id": "5e9a7fbdf54cde83"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.353611Z",
     "start_time": "2024-08-07T01:20:10.344355Z"
    }
   },
   "cell_type": "code",
   "source": [
    "data = (data - data.mean())/data.std()\n",
    "data"
   ],
   "id": "86c226f19796b654",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          面积      卧室数量        售价\n",
       "0   0.130010 -0.223675  0.475747\n",
       "1  -0.504190 -0.223675 -0.084074\n",
       "2   0.502476 -0.223675  0.228626\n",
       "3  -0.735723 -1.537767 -0.867025\n",
       "4   1.257476  1.090417  1.595389\n",
       "5  -0.019732  1.090417 -0.323998\n",
       "6  -0.587240 -0.223675 -0.204036\n",
       "7  -0.721881 -0.223675 -1.130948\n",
       "8  -0.781023 -0.223675 -1.026973\n",
       "9  -0.637573 -0.223675 -0.783051\n",
       "10 -0.076357  1.090417 -0.803053\n",
       "11 -0.000857 -0.223675  0.052682\n",
       "12 -0.139273 -0.223675 -0.083283\n",
       "13  3.117292  2.404508  2.874981\n",
       "14 -0.921956 -0.223675 -0.643896\n",
       "15  0.376643  1.090417  0.875619\n",
       "16 -0.856523 -1.537767 -0.323998\n",
       "17 -0.962223 -0.223675 -1.123743\n",
       "18  0.765468  1.090417  1.276275\n",
       "19  1.296484  1.090417  2.068039\n",
       "20 -0.294048 -0.223675 -0.699878\n",
       "21 -0.141790 -1.537767 -0.683083\n",
       "22 -0.499157 -0.223675 -0.779852\n",
       "23 -0.048673  1.090417 -0.643896\n",
       "24  2.377392 -0.223675  1.867303\n",
       "25 -1.133356 -0.223675 -0.723870\n",
       "26 -0.682873 -0.223675  0.992382\n",
       "27  0.661026 -0.223675  1.028370\n",
       "28  0.250810 -0.223675  1.076355\n",
       "29  0.800701 -0.223675 -0.323998\n",
       "30 -0.203448 -1.537767  0.075875\n",
       "31 -1.259189 -2.851859 -1.363666\n",
       "32  0.049477  1.090417 -0.204036\n",
       "33  1.429868 -0.223675  1.915287\n",
       "34 -0.238682  1.090417 -0.435962\n",
       "35 -0.709298 -0.223675 -0.723870\n",
       "36 -0.958448 -0.223675 -0.883819\n",
       "37  0.165243  1.090417  0.036687\n",
       "38  2.786350  1.090417  1.668166\n",
       "39  0.202993  1.090417 -0.427165\n",
       "40 -0.423657 -1.537767  0.224627\n",
       "41  0.298626 -0.223675 -0.084074\n",
       "42  0.712618  1.090417 -0.211234\n",
       "43 -1.007523 -0.223675 -0.331196\n",
       "44 -1.445423 -1.537767 -1.283692\n",
       "45 -0.187090  1.090417 -0.323998\n",
       "46 -1.003748 -0.223675 -0.807044"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>面积</th>\n",
       "      <th>卧室数量</th>\n",
       "      <th>售价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.130010</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.475747</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.504190</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.084074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.502476</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.228626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.735723</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-0.867025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.257476</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>1.595389</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.019732</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.587240</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.204036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.721881</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-1.130948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.781023</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-1.026973</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-0.637573</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.783051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>-0.076357</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.803053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>-0.000857</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.052682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>-0.139273</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.083283</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>3.117292</td>\n",
       "      <td>2.404508</td>\n",
       "      <td>2.874981</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>-0.921956</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.643896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0.376643</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>0.875619</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>-0.856523</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>-0.962223</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-1.123743</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>0.765468</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>1.276275</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>1.296484</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>2.068039</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>-0.294048</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.699878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>-0.141790</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-0.683083</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>-0.499157</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.779852</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>-0.048673</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.643896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>2.377392</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.867303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>-1.133356</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.723870</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>-0.682873</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.992382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>0.661026</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.028370</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>0.250810</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.076355</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>0.800701</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>-0.203448</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>0.075875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>-1.259189</td>\n",
       "      <td>-2.851859</td>\n",
       "      <td>-1.363666</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>0.049477</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.204036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>1.429868</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.915287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>-0.238682</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.435962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>-0.709298</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.723870</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>-0.958448</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.883819</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>0.165243</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>0.036687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>2.786350</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>1.668166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>0.202993</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.427165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>-0.423657</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>0.224627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>0.298626</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.084074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>0.712618</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.211234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>-1.007523</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.331196</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>-1.445423</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-1.283692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>-0.187090</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>-1.003748</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.807044</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 146
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.431516Z",
     "start_time": "2024-08-07T01:20:10.422957Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# 数据添加一列 代表公式中的b \n",
    "#data.drop('Ones',axis=1,inplace=True)\n",
    "data.insert(0,'Ones',1)\n",
    "data "
   ],
   "id": "1605505bc03f7693",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "    Ones        面积      卧室数量        售价\n",
       "0      1  0.130010 -0.223675  0.475747\n",
       "1      1 -0.504190 -0.223675 -0.084074\n",
       "2      1  0.502476 -0.223675  0.228626\n",
       "3      1 -0.735723 -1.537767 -0.867025\n",
       "4      1  1.257476  1.090417  1.595389\n",
       "5      1 -0.019732  1.090417 -0.323998\n",
       "6      1 -0.587240 -0.223675 -0.204036\n",
       "7      1 -0.721881 -0.223675 -1.130948\n",
       "8      1 -0.781023 -0.223675 -1.026973\n",
       "9      1 -0.637573 -0.223675 -0.783051\n",
       "10     1 -0.076357  1.090417 -0.803053\n",
       "11     1 -0.000857 -0.223675  0.052682\n",
       "12     1 -0.139273 -0.223675 -0.083283\n",
       "13     1  3.117292  2.404508  2.874981\n",
       "14     1 -0.921956 -0.223675 -0.643896\n",
       "15     1  0.376643  1.090417  0.875619\n",
       "16     1 -0.856523 -1.537767 -0.323998\n",
       "17     1 -0.962223 -0.223675 -1.123743\n",
       "18     1  0.765468  1.090417  1.276275\n",
       "19     1  1.296484  1.090417  2.068039\n",
       "20     1 -0.294048 -0.223675 -0.699878\n",
       "21     1 -0.141790 -1.537767 -0.683083\n",
       "22     1 -0.499157 -0.223675 -0.779852\n",
       "23     1 -0.048673  1.090417 -0.643896\n",
       "24     1  2.377392 -0.223675  1.867303\n",
       "25     1 -1.133356 -0.223675 -0.723870\n",
       "26     1 -0.682873 -0.223675  0.992382\n",
       "27     1  0.661026 -0.223675  1.028370\n",
       "28     1  0.250810 -0.223675  1.076355\n",
       "29     1  0.800701 -0.223675 -0.323998\n",
       "30     1 -0.203448 -1.537767  0.075875\n",
       "31     1 -1.259189 -2.851859 -1.363666\n",
       "32     1  0.049477  1.090417 -0.204036\n",
       "33     1  1.429868 -0.223675  1.915287\n",
       "34     1 -0.238682  1.090417 -0.435962\n",
       "35     1 -0.709298 -0.223675 -0.723870\n",
       "36     1 -0.958448 -0.223675 -0.883819\n",
       "37     1  0.165243  1.090417  0.036687\n",
       "38     1  2.786350  1.090417  1.668166\n",
       "39     1  0.202993  1.090417 -0.427165\n",
       "40     1 -0.423657 -1.537767  0.224627\n",
       "41     1  0.298626 -0.223675 -0.084074\n",
       "42     1  0.712618  1.090417 -0.211234\n",
       "43     1 -1.007523 -0.223675 -0.331196\n",
       "44     1 -1.445423 -1.537767 -1.283692\n",
       "45     1 -0.187090  1.090417 -0.323998\n",
       "46     1 -1.003748 -0.223675 -0.807044"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Ones</th>\n",
       "      <th>面积</th>\n",
       "      <th>卧室数量</th>\n",
       "      <th>售价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.130010</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.475747</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.504190</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.084074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0.502476</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.228626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.735723</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-0.867025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1.257476</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>1.595389</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.019732</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.587240</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.204036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.721881</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-1.130948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.781023</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-1.026973</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.637573</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.783051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.076357</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.803053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.000857</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.052682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.139273</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.083283</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>1</td>\n",
       "      <td>3.117292</td>\n",
       "      <td>2.404508</td>\n",
       "      <td>2.874981</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.921956</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.643896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>1</td>\n",
       "      <td>0.376643</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>0.875619</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.856523</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.962223</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-1.123743</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>1</td>\n",
       "      <td>0.765468</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>1.276275</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>1</td>\n",
       "      <td>1.296484</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>2.068039</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.294048</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.699878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.141790</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-0.683083</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.499157</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.779852</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.048673</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.643896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>1</td>\n",
       "      <td>2.377392</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.867303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>1</td>\n",
       "      <td>-1.133356</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.723870</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.682873</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>0.992382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>1</td>\n",
       "      <td>0.661026</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.028370</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>1</td>\n",
       "      <td>0.250810</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.076355</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>1</td>\n",
       "      <td>0.800701</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.203448</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>0.075875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>1</td>\n",
       "      <td>-1.259189</td>\n",
       "      <td>-2.851859</td>\n",
       "      <td>-1.363666</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>1</td>\n",
       "      <td>0.049477</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.204036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>1</td>\n",
       "      <td>1.429868</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>1.915287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.238682</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.435962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.709298</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.723870</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.958448</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.883819</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>1</td>\n",
       "      <td>0.165243</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>0.036687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>1</td>\n",
       "      <td>2.786350</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>1.668166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>1</td>\n",
       "      <td>0.202993</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.427165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.423657</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>0.224627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>1</td>\n",
       "      <td>0.298626</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.084074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>1</td>\n",
       "      <td>0.712618</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.211234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>1</td>\n",
       "      <td>-1.007523</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.331196</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>1</td>\n",
       "      <td>-1.445423</td>\n",
       "      <td>-1.537767</td>\n",
       "      <td>-1.283692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.187090</td>\n",
       "      <td>1.090417</td>\n",
       "      <td>-0.323998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>1</td>\n",
       "      <td>-1.003748</td>\n",
       "      <td>-0.223675</td>\n",
       "      <td>-0.807044</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 147
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.519426Z",
     "start_time": "2024-08-07T01:20:10.514342Z"
    }
   },
   "cell_type": "code",
   "source": [
    "cols = data.shape[1]\n",
    "x = data.iloc[:,:-1].values\n",
    "y = data.iloc[:,cols-1:cols].values\n",
    "x.shape,y.shape\n"
   ],
   "id": "a592a9646642dc43",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((47, 3), (47, 1))"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 148
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.583838Z",
     "start_time": "2024-08-07T01:20:10.580246Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义k值\n",
    "k = np.zeros((x.shape[1],1))"
   ],
   "id": "732fbec164d19e7d",
   "outputs": [],
   "execution_count": 149
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.624179Z",
     "start_time": "2024-08-07T01:20:10.620843Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def compute_cost(a, b, c):\n",
    "    inner = np.power((np.dot(a,c)-b), 2)\n",
    "    return np.sum(inner) / (2 * a.shape[0])"
   ],
   "id": "4f569a328a15557",
   "outputs": [],
   "execution_count": 150
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.653993Z",
     "start_time": "2024-08-07T01:20:10.649443Z"
    }
   },
   "cell_type": "code",
   "source": "compute_cost(x, y, k)",
   "id": "b9dfd96cdd56266b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.48936170212765967"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 151
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "c46e96b1e709027e"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 批量梯度下降\n",
    "$$ k_j = k_j - \\alpha\\frac{d}{dk_j}J(k_1,k_2,...,k_n) $$ \n",
    "$$ \\frac{d}{dk_j}J(k_1,k_2,...,k_n) = \\frac{d}{dk_j}\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{\\left(f( {{x_1}^{(i)}} ,{x}_2^{(i)},...,{x}_n^{(i)})-{{y}^{(i)}} \\right)}^{2}}} = \\frac{1}{m}\\sum\\limits_{i=1}^{m} ({k_1}{x_1}^{(i)} +{{k_2}{x_2}}+...,{{k_n}{x_n}} +b-y){{x}_j}^{i}$$\n"
   ],
   "id": "db9297124935dcfc"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "dd75f45c9f8358ae"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.679403Z",
     "start_time": "2024-08-07T01:20:10.675533Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def gradient_descent(a, b, c, alpha,iters):\n",
    "    costs = np.zeros(iters)\n",
    "    for i in range(iters):\n",
    "        error = (a @ c -b)\n",
    "        c =c - alpha * (a.T @ error)/a.shape[0]\n",
    "        costs[i] = compute_cost(a, b, c)\n",
    "    return c,compute_cost(a,b,c),costs\n",
    "    "
   ],
   "id": "7cb664c125053bc7",
   "outputs": [],
   "execution_count": 152
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.703187Z",
     "start_time": "2024-08-07T01:20:10.684409Z"
    }
   },
   "cell_type": "code",
   "source": [
    "iterNum = 1000\n",
    "last_c,last_cost,costs = gradient_descent(x,y,k,0.03,iterNum)\n",
    "print(last_c,last_cost)"
   ],
   "id": "88509306ba73fc51",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-1.00912186e-16]\n",
      " [ 8.84764932e-01]\n",
      " [-5.31777642e-02]] 0.13068648053952178\n"
     ]
    }
   ],
   "execution_count": 153
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.874560Z",
     "start_time": "2024-08-07T01:20:10.782864Z"
    }
   },
   "cell_type": "code",
   "source": [
    "fig,ax = plt.subplots(figsize=(12,8))\n",
    "ax.plot(np.arange(iterNum),costs,'r')\n",
    "ax.set_title('学习曲线')\n",
    "ax.set_xlabel('次数')\n",
    "ax.set_ylabel('成本')\n",
    "plt.show()"
   ],
   "id": "6d6d9db6a82c4987",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+4AAAK6CAYAAACnjAbrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABQ3ElEQVR4nO3de7xVdYH///fhHO7KzSsCKqmVaJQRZuRok4h9Vcz86nfS6ds3x6nM5leal6SymizFUrKrpaKOjVaTpaaFdpFQR0ExUQkvaVCCmmjHc0DkcNu/P/aco8RFQGDvtfbz+Xjsx76cvdb5bB6ry+t8PmvtpkqlUgkAAABQl7rVegAAAADAugl3AAAAqGPCHQAAAOqYcAcAAIA6JtwBAACgjgl3AAAAqGPCHQAAAOqYcAcAAIA6JtwBoCRaW1u7Hr/00ks577zzsmTJkq7XKpVKjj/++PzqV7/aouNoa2vLb37zm7zwwgtdz6+77ro8/fTTW/T3AkBZCXcAKIGvfvWrGTFiRB544IEkyZ/+9Kece+65+fjHP971nltuuSU/+tGPcvvtt6+x/V//+tfcf//9+cMf/pBHHnlkvbc//vGP6x3LI488kkMPPTR/+tOfkiTPPPNMjjvuuDz44IOv+jmOOeaYTJw4cbXXpk2blje84Q2ZOnVqVqxYkQULFrzqfgCgTJoqlUql1oMAAF6b9vb2HHrooZk7d24eeuih7LTTTrn44ovz6U9/Oo888kiGDx+ed77znenTp09uvfXWdOu2+t/uv/GNb+T0009PS0tLunfvnubm5rX+nqVLl2annXbKn//853WO5aGHHsrIkSPzxBNP5HWve13mz5+fYcOGZerUqXnXu961zu0eeeSRjBgxIjfffHMOP/zwrtdnzZqV/fbbL7NmzcrUqVNz0UUX5d57783OO++8cf9IAFBQLbUeAADw2vXr1y833HBDrr/++uy0005Jkn/7t3/LuHHjMnz48PzkJz/Jgw8+mNmzZ68R7UnyyU9+Mp/85Cdf9feceuqpueOOO9b7nqampiRZ6+9Zny996Us58cQTc/jhh2fRokXZdtttkyQDBgxIkvTp0yef+MQnMn369DzyyCPCHYCGYak8ABTc//7f/ztNTU3ZZZdd8vGPfzxNTU1pampK9+7ds88++6SpqSn/5//8nyxevDi7775718+nTJmy2n5aW1vzz//8z5k1a9Y6f1dHR0dXUHe6884709TUlB49eqRXr14ZNWpUkuQNb3hDevXqlT333DNJMm7cuPTq1Su9evVKU1NTvvrVr3btY9q0afnNb36TCy64IPPmzcsuu+ySn/70p6v9nsWLF+f+++/P2LFj8/3vfz8nnnjia/lnA4DCMOMOAAXXp0+fHH744fn+97+/Qe9fsmRJ3vCGN6Rnz56rvf78889n/vz5GTVqVE466aScf/752W677VZ7z9KlS9O7d+/VXuvVq1eS5Fe/+lXe9a53Zfbs2XnTm96URx99NLvvvnvXUvnOn69YsSLdu3fv+v2PPPJITjjhhFxwwQXp1atXzj777AwfPjzbbbddvva1r2X69OlJkre//e154xvfmP322y9vetObst9++23SvxcAFI1wB4AS2H777TNkyJC8+OKL6dGjR3r06LHO9y5ZsiS77bZb15L2TnvuuWemTZuW//zP/8xpp52WG264IVOmTOmaQU+qM+6dod5pXefDv5rO7e6888489dRT+Zd/+ZeccsopWb58ee65557ccccdufvuu/MP//APueGGG/KLX/wihx56aNf2y5YtS2trawYOHLhJvx8AikK4A0DB/eAHP0iSzJs3L8OHD1/vew855JD85je/ybx589b5ng984AMZO3Zszj333Oyzzz6r/ayjo2ONmfq//wPAxjrhhBOy11575W1ve1s++clPpl+/fnnrW9+at771rV3n3X/lK1/JnDlzsmTJkjz44IO56667cvvtt+ess87KF77whdf0+wGg3gl3ACiJoUOH5vHHH0/Pnj3T3NycpqamLFu2LF//+tfz7W9/O7vttls+8IEPbNC+dt5553znO99JksydOzdPPPFExo4du9Zz3DuNGzcu3bp1S+cX1rzhDW9YLeo7f/73+vTpk4MPPji/+93v8tvf/jazZ89Oktx222255pprMmfOnLzwwgv57Gc/m5EjR2bkyJEZP358Pve5z+XNb37zRv0bAUARuTgdAJRES0tL9thjjwwdOjSDBw9O//79M3bs2Fx22WX58pe/nIcffjgf+tCHNmhfy5Yty89+9rMcfvjh2XPPPXPTTTclqZ7j/vdL5Tv96le/ytKlS3PfffclSR599NEsXbo0jz/++Go/X7x48Rrb/v73v8/73//+fOMb38hLL72UOXPmZNmyZdl1113z2c9+NieddFIOP/zw3HXXXfn85z+fH/3oR+ndu3e22WabTfiXAoBiMeMOAAX3hz/8IZVKJS0tq//P+qpVq/LEE0/kvPPOy3vf+9488cQTXT9btmxZdtxxx9W+Um3VqlW544478uMf/zg//vGP09LSkg984AP56le/mn333TfJ2s9xf60qlUqOPPLI/PWvf80xxxyTJNl1113zpz/9Ke95z3uSJMuXL8/HP/7xLFy4MEcffXQWLly41j8AAEAZCXcAKLgTTjghTzzxxBrhnlRj/Etf+lLOP//81V5ftmxZzj333Jx++ulJks997nO57LLL8uyzz+Yd73hHvve97+V973vfGvvcEuHe1NSUyy+/PNtss0322GOPDB48eI0l9ePGjUt7e3v23XffbL/99rnrrrsyePDgzToOAKhXwh0ACu6BBx5Y58+22WabXH755Xn/+9+/3n384z/+Y5544omcdtpp2X///df5vmeeeSZ9+/Zd7bXOc9pfi8MPPzytra157LHH8vOf/zwzZszIiBEjctZZZyVJ7rvvvnTv3j0LFy7M7bffnsGDB2fx4sWWygPQEIQ7AJBDDjkkhxxyyBqvt7e35/vf/36amppy77335sknn8yb3vSm1d6zYsWKJBt/cbpVq1YlSR588MEcdNBBaWtry6BBg3LggQdmzJgxOfzww7No0aJ85StfyaRJk3LqqafmhhtuyFlnnZWf/vSn+cpXvpKZM2fm17/+9Wb/9wCAeiLcAaBknn322dx+++159tln8+KLL6Z79+6bvK9+/frll7/8Ze66664MHz48n/rUp3LUUUet9p6Ojo4k1YvPvetd73rVfa5YsSLdu3fP0qVLkyQjR47MF7/4xYwaNSpjxozp+n73L3zhC/nWt76V3r1756abbsphhx2Wk046KQcddFD22WefzJ8/Px/96Ec3+bMBQFE0VTbH+jYAoG50dHRk2LBhWbx4cd7xjnfkxz/+cbbffvtN3t+yZcvSo0ePzTjCDfPzn/88d911Vz7zmc+kX79+Xa//6U9/yr/927+lW7du+fGPf7zG0n0AKBvhDgAltGjRonV+3zoAUCzCHQAAAOpYt1d/CwAAAFArwh0AAADqmHAHAACAOibcAQAAoI75Hvckq1atylNPPZVtt902TU1NtR4OAAAAJVepVLJo0aLssssu6dZt/XPqwj3J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E088kfHjx+eGG27ITTfdlJtuuinbbrttbrnlltx2223r3VdLS8saF7nr1atXlixZ8qrjGDduXKZMmZKWlpacddZZa93fq+1rwoQJaWtr67o9+eSTr/p7C0G4AwAAlM5Gn+Peq1evPProo/nOd76Tn/3sZ9l3333z29/+NsuXL9+g8E6SQYMGZeHChau9tmjRog26In1LS0sOPPDAfPOb38yVV1651v292r569uyZfv36rXYrBeEOAABQOhsd7p3e9a53ZcqUKbnoooty4okn5stf/nJ+//vfb9C2o0ePzvTp07uez5s3Lx0dHRk0aNA6t7n22mtz0UUXdT1vaWlJc3PzWvc3a9asDBkyZGM/UvEJdwAAgNLZ6HB/5UXdkuTwww/PjBkzcuutt+arX/3qBu3joIMOSltbW9dF7SZOnJixY8emubk57e3tWb58+RrbvPGNb8wXv/jFXH/99Zk3b16+8IUv5LjjjkuSHHXUUbnzzjszderUrFixIhdeeGEOO+ywjf1oxbfNNtX7xYtrOw4AAAA2m40K91WrVmWHHXZY4/XBgwfnlltuyZ133pnLLrvsVffT0tKSSy+9NCeffHJ22mmnXHfddZk4cWKS6hXmf/GLX6yxzVvf+tZccskl+dSnPpX99tsvu+22WyZNmpQk2X777XPRRRflsMMOy+DBgzN79ux87nOf25iPVg5m3AEAAEqnqfLKy8K/Ro899lh69+6dYcOGbdD7FyxYkJkzZ2bMmDFr/YPAxnr88cfz8MMP5+CDD96o89bb29vTv3//tLW1Fft897vvTsaMSYYPT/70p1qPBgAAgHXYmA7dqBn3l156Ke973/uSJK2trWv8/MMf/nB233337L///nlxA2Z9hwwZkve+972bJdqTZM8998z48eOLHd+vxbbbVu8XLartOAAAANhsNjjczzjjjJx22mn5zW9+kyQ54ogjcvDBB692Ubhp06Zl8uTJuf/++7N06dLNP1rWT7gDAACUzgaF+9VXX52bb74555xzTtfXrF1yySV5+9vfniOOOCLHHXdcFixYkBtuuCGnn356zj333Gy33XZbdOCsRWe4d3Qka7nAHwAAAMWzQee4v/DCC3nxxRczZMiQ7Ljjjnn22We7fvbf//3fOfHEE/OXv/wlgwYNylVXXZVx48Zt0UFvbqU5x3358qTz++uffz5Zz9frAQAAUDsb06EtG7LDn//855k6dWrXzg899NA888wz+fOf/5xtttkm73jHO/KhD30oX//617Ny5crX/gnYNN27Jz17VmfcFy0S7gAAACWwQeHet2/f7L777unTp0969uyZ008/PUOHDs2QIUMycODArvf94z/+Y4466qhMnTo1++677xYbNOux7bYvhzsAAACFt9FfB/fKpfITJ07MgAEDst1222W77bbLrrvumt/+9rf59re/nfvuu6/rfPh6V5ql8knyutclc+cmd92VvOMdtR4NAAAAa7HZl8qvy7//+7/n+OOPz+LFi/P888/n3nvvzZe+9KUceOCBeemllwoT7qXiyvIAAAClstHh/vcT9FdccUXX469//euZOnVqbrzxxtc+MjaNcAcAACiVjQ73pqamtT5OkkMOOSRjx4597aNi0wl3AACAUtnocP/b3/6W5ubmJNXZ9169eqVv374ZMmRI3vSmN+V973tf9tlnn3TrtkFfEc/mJtwBAABKZaPD/dlnn01TU1PXbHtHR0daW1vz6KOP5vbbb88nPvGJnHfeebn33nu7Ap+tSLgDAACUykaH+6C1fDf4TjvtlDe+8Y1573vfmy9/+cv51a9+JdprpfNqhMIdAACgFDb7evbevXvnve997+beLRuqc8a9vb224wAAAGCzcCJ62VgqDwAAUCrCvWyEOwAAQKkI97IR7gAAAKUi3MtGuAMAAJSKcC8b4Q4AAFAqwr1shDsAAECpCPeyEe4AAAClItzL5pXhXqnUdiwAAAC8ZsK9bDrDfdWq5KWXajsWAAAAXjPhXjZ9+7782HJ5AACAwhPuZdOtm/PcAQAASkS4l5FwBwAAKA3hXkbCHQAAoDSEexkJdwAAgNIQ7mUk3AEAAEpDuJeRcAcAACgN4V5GneHe3l7bcQAAAPCaCfcyMuMOAABQGsK9jIQ7AABAaQj3Murfv3pvqTwAAEDhCfcy6gz3F16o6TAAAAB47YR7GQ0YUL1va6vpMAAAAHjthHsZmXEHAAAoDeFeRp3hbsYdAACg8IR7GVkqDwAAUBrCvYwslQcAACgN4V5GneHe0VG9AQAAUFjCvYz69UuamqqPLZcHAAAoNOFeRt26JdtuW31suTwAAEChCfeycmV5AACAUhDuZeXK8gAAAKUg3MvKleUBAABKQbiXlaXyAAAApSDcy8pSeQAAgFIQ7mVlqTwAAEApCPeyslQeAACgFIR7WVkqDwAAUArCvawslQcAACgF4V5WlsoDAACUgnAvK0vlAQAASkG4l5Wl8gAAAKUg3MvKUnkAAIBSEO5l9cql8pVKTYcCAADAphPuZdU5475yZfLii7UdCwAAAJtMuJdVnz5Jc3P1seXyAAAAhSXcy6qpyZXlAQAASkC4l5krywMAABSecC+zgQOr98IdAACgsIR7mQ0aVL3/299qOw4AAAA2mXAvM+EOAABQeMK9zIQ7AABA4Qn3MhPuAAAAhSfcy0y4AwAAFJ5wLzPhDgAAUHjCvcyEOwAAQOEJ9zIT7gAAAIUn3MtMuAMAABSecC+zznBvbU1WrartWAAAANgkwr3MBg6s3q9albS313YsAAAAbJKahfvs2bMzevToDBw4MGeeeWYqlcqrbnPppZdm8ODB6d69e8aNG5enn36662fjx49PU1NT123s2LFbcvjF0LNn0rdv9bHl8gAAAIVUk3Dv6OjI+PHjM2rUqMycOTNz5szJVVddtd5t7rzzzpxzzjn5wQ9+kLlz52bp0qU544wzun5+33335aGHHkpra2taW1tz4403buFPURDOcwcAACi0moT7lClT0tbWlkmTJmWPPfbIeeedl8mTJ693m0cffTSXXHJJxo4dm6FDh+bEE0/MzJkzkyTz589PpVLJvvvumwEDBmTAgAHp2znT3OiEOwAAQKG11OKXPvDAAznggAPSp0+fJMnIkSMzZ86c9W5z0kknrfb80UcfzZ577pkkueeee7Jy5coMHTo0ra2tGT9+fC655JIM7DzH++90dHSko6Oj63l7mc//Fu4AAACFVpMZ9/b29gwfPrzreVNTU5qbm9Pa2rpB2z///PP5/ve/n1NOOSVJ8thjj2XUqFG59dZbM3PmzMybNy+f+cxn1rn9+eefn/79+3fdhg0b9to+UD3r/OOFcAcAACikmoR7S0tLevbsudprvXr1ypIlSzZo+1NOOSVjxozJEUcckSQ5++yzM2XKlOyzzz7Ze++9c8EFF+S6665b5/YTJkxIW1tb1+3JJ5/c9A9T78y4AwAAFFpNlsoPGjQos2fPXu21RYsWpUePHq+67RVXXJHbb789s2bNWud7BgwYkOeeey4dHR1r/IEgSXr27LnW10tJuAMAABRaTWbcR48enenTp3c9nzdvXjo6OjKoMzLX4Z577smpp56aH/3oR9lpp526Xj/22GNX29+9996bnXfeuXHifH2EOwAAQKHVJNwPOuigtLW15eqrr06STJw4MWPHjk1zc3Pa29uzfPnyNbb561//mvHjx+fTn/50Ro0alcWLF2fx4sVJqhe3O+200zJjxozcfPPNOeecc7rOf294wh0AAKDQanaO+6WXXpqTTz45O+20U6677rpMnDgxSTXCf/GLX6yxzQ9/+MM8++yz+dznPpdtt92265ZUz1kfMWJEDj300Jx66qn52Mc+lgkTJmzVz1S3hDsAAEChNVUqlUqtfvmCBQsyc+bMjBkzJjvssEOthpH29vb0798/bW1t6devX83GsUVMnZq8+93J3nsnr/KVewAAAGwdG9OhNbk4XachQ4ZkyJAhtRxC+XXOuD//fG3HAQAAwCapyVJ5tqLttqve/+1vSe0WVwAAALCJhHvZdZ6CsGJF8sILNR0KAAAAG0+4l13Pnsn/XMQvCxfWdiwAAABsNOHeCDpn3YU7AABA4Qj3RiDcAQAACku4NwLhDgAAUFjCvREIdwAAgMIS7o1AuAMAABSWcG8Ewh0AAKCwhHsjEO4AAACFJdwbgXAHAAAoLOHeCIQ7AABAYQn3RvDKcK9UajsWAAAANopwbwSd4d7RkSxeXNuxAAAAsFGEeyPo2zfp3bv62HJ5AACAQhHujcJ57gAAAIUk3BuFcAcAACgk4d4ohDsAAEAhCfdGIdwBAAAKSbg3CuEOAABQSMK9Uey4Y/X+2WdrOw4AAAA2inBvFDvtVL3/619rOw4AAAA2inBvFIMHV++ffrq24wAAAGCjCPdGsfPO1ftnnqntOAAAANgowr1RdM64L1yYrFhR27EAAACwwYR7o9h++6S5OalUXKAOAACgQIR7o+jW7eUL1FkuDwAAUBjCvZF0nufuAnUAAACFIdwbiQvUAQAAFI5wbyS+Eg4AAKBwhHsjMeMOAABQOMK9kZhxBwAAKBzh3kjMuAMAABSOcG8kZtwBAAAKR7g3klfOuFcqtR0LAAAAG0S4N5LOcH/ppWTRotqOBQAAgA0i3BtJnz5Jv37Vx5bLAwAAFIJwbzSd57m7QB0AAEAhCPdG07lc/qmnajsOAAAANohwbzRDh1bv58+v7TgAAADYIMK90QwbVr0X7gAAAIUg3BtN54z7k0/WdhwAAABsEOHeaCyVBwAAKBTh3mgslQcAACgU4d5oOmfcn3kmWbastmMBAADgVQn3RrP99kmPHkmlkjz9dK1HAwAAwKsQ7o2mW7dkyJDqY8vlAQAA6p5wb0Sd57m7sjwAAEDdE+6NyJXlAQAACkO4NyLhDgAAUBjCvRFZKg8AAFAYwr0RmXEHAAAoDOHeiIQ7AABAYQj3RtS5VP7pp5Nly2o7FgAAANZLuDeiHXdMevVKKhWz7gAAAHVOuDeipqZkt92qj+fOre1YAAAAWC/h3qiGD6/eC3cAAIC6JtwblXAHAAAoBOHeqDrDfd68mg4DAACA9RPujWr33av3ZtwBAADqmnBvVJbKAwAAFIJwb1Sd4f7MM8lLL9V2LAAAAKyTcG9UgwYl225bfew8dwAAgLol3BtVU9PL57kLdwAAgLol3BuZ89wBAADqnnBvZMIdAACg7gn3RibcAQAA6p5wb2R77FG9f/zx2o4DAACAdRLujWyvvar3f/xjUqnUdiwAAACslXBvZMOHJ83NyZIlyVNP1Xo0AAAArIVwb2Q9erx8nvsf/1jbsQAAALBWwr3RdS6Xf+yx2o4DAACAtapZuM+ePTujR4/OwIEDc+aZZ6ayAedYX3rppRk8eHC6d++ecePG5emnn+762bRp07L33ntn++23z6RJk7bk0Mvl9a+v3gt3AACAulSTcO/o6Mj48eMzatSozJw5M3PmzMlVV1213m3uvPPOnHPOOfnBD36QuXPnZunSpTnjjDOSJAsXLsxRRx2V448/PnfffXeuueaaTJ06dSt8khJ45QXqAAAAqDs1CfcpU6akra0tkyZNyh577JHzzjsvkydPXu82jz76aC655JKMHTs2Q4cOzYknnpiZM2cmSa655poMHjw455xzTvbaa698/vOff9X98T/MuAMAANS1llr80gceeCAHHHBA+vTpkyQZOXJk5syZs95tTjrppNWeP/roo9lzzz279vfud787TU1NSZL9998/EyZMWOe+Ojo60tHR0fW8vb19kz5HKXSG+xNPJCtWJC01OSQAAABYh5rMuLe3t2d459XMkzQ1NaW5uTmtra0btP3zzz+f73//+znllFPWur9+/fplwYIF69z+/PPPT//+/btuw4YN28RPUgLDhiU9eybLlyd/+UutRwMAAMDfqUm4t7S0pGfPnqu91qtXryxZsmSDtj/llFMyZsyYHHHEEWvd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bBThzpbVt2/1yvItLcmPf5xceWWtRwQAAFAowp0t7+1vT849t/r4//v/kkceqe14AAAACkS4s3WcdVZyyCHJkiXJMcck7e21HhEAAEAh1CzcZ8+endGjR2fgwIE588wzU9nAc58ff/zxDBo0aI3Xx48fn6ampq7b2LFjN/eQeS26dUv+8z+TIUOShx9OPvCBZNWqWo8KAACg7tUk3Ds6OjJ+/PiMGjUqM2fOzJw5c3LVVVe96nZz587NEUcckdbW1jV+dt999+Whhx5Ka2trWltbc+ONN26BkfOa7Lxzcv31Sc+eyU03JV/4Qq1HBAAAUPdqEu5TpkxJW1tbJk2alD322CPnnXdeJk+e/KrbHXHEEfnXf/3XNV6fP39+KpVK9t133wwYMCADBgxI3759t8TQea1Gj04uu6z6+MtfTjbgDzYAAACNrCbh/sADD+SAAw5Inz59kiQjR47MnDlzXnW7m2++Occdd9war99zzz1ZuXJlhg4dmr59++b973//WmflO3V0dKS9vX21G1vR//2/ydlnVx//678mv/hFbccDAABQx2oS7u3t7Rk+fHjX86ampjQ3N683tpPkda973Vpff+yxxzJq1KjceuutmTlzZubNm5fPfOYz69zP+eefn/79+3fdhg0btmkfhE133nnJBz+YrFyZHHdcctddtR4RAABAXapJuLe0tKRnz56rvdarV68sWbJkk/Z39tlnZ8qUKdlnn32y995754ILLsh11123zvdPmDAhbW1tXbcnn3xyk34vr0FTU3L55cn/+l/JSy9V72fMqPWoAAAA6k5Nwn3QoEFZuHDhaq8tWrQoPXr02Cz7HzBgQJ577rl0dHSs9ec9e/ZMv379VrtRA927Jz/5SXLQQdWvhxs3TrwDAAD8nZqE++jRozN9+vSu5/PmzUtHR8dav+ZtQxx77LGr7e/ee+/NzjvvvMasPnWob9/kl79cPd5/97tajwoAAKBu1CTcDzrooLS1teXqq69OkkycODFjx45Nc3Nz2tvbs3z58o3a38iRI3PaaadlxowZufnmm3POOefklFNO2RJDZ0vojPd3vasa74cdlvzXf9V6VAAAAHWhZue4X3rppTn55JOz00475brrrsvEiROTVCP8Fxt5lfEJEyZkxIgROfTQQ3PqqafmYx/7WCZMmLAlhs6W0rdvMmVKcswxybJlyfvf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otH9+te/zve+971ce+216d69+3qPUccvW9O5556b0aNH54gjjljtdcco9WL+/Pl5+9vfnkGDBiWp/p/OkSNHZunSpY5R6sKPf/zjvP/978/++++fbbbZJl/+8pfzpz/9yX+PUpc29bgs4jEr3Atg9OjRmT59etfzefPmpaOjo+t/9GFr+tOf/pR//ud/ziWXXJIRI0YkWf8x6vhla7r22mtz4403ZsCAARkwYECuvfbanHLKKfmP//gPxyh1YdiwYXnppZdWe+3Pf/5zLrroIscodWHFihX561//2vV80aJFefHFF9PS0uIYpe5s6v8HLeIxK9wL4KCDDkpbW1uuvvrqJMnEiRMzduzYNDc313hkNJqXXnopRx55ZI4++ui8973vzeLFi7N48eL8wz/8wzqPUccvW9Mdd9yR2bNnZ9asWZk1a1aOOuqofOlLX8rtt9/uGKUuHHHEEXn44Yfzve99L/Pnz883v/nNzJo1K+PGjXOMUhfe+c535mc/+1m+/vWv59prr83RRx+dnXbaKZ/4xCcco9Sd9R17m/qzulXry9qzYa6//vpK7969KzvuuGNlu+22q8yePbvWQ6IBXX/99ZUka9zmzp273mPU8Uut/L//9/8qV155ZaVSWf9x6Bhla7r77rsrY8aMqfTu3bsyfPjwyvXXX1+pVByj1IdVq1ZVvvjFL1Z23XXXSvfu3Sv77bdfZebMmZVKxTFKfcgrvg6uUtn047Jox2xTpVKp1PIPB2y4BQsWZObMmRkzZkx22GGHWg8H1rC+Y9TxSz1wjFLvHKPUO8co9WhTj8siHbPCHQAAAOqYc9wBAACgjgl3AAAAqGPCHQAAAOqYcAcAAIA6JtwBgFf17LPP5m9/+1uthwEADUm4AwCrmT9/fpYsWbLaa5MnT86RRx65zm0uvfTSPPHEE7n66qtz5JFHZunSpfnUpz6VJPn4xz+eyZMnb9ExA0CZCXcAYDVnnHFG/uVf/mW1137605/mrLPOWuc2gwYNyj/90z+le/fu6d69e37yk5/k+eefT5Lccccd2WWXXbbomAGgzIQ7ALCab3/727nrrrvyjW98I0ly33335b777stJJ52U7bfffrXbNddck2XLlqWpqSnHHHNMHnrooTz33HN57LHHMmLEiDz00EN57LHHcvDBBydJVq1alY6Ojlp+PAAonKZKpVKp9SAAgPoybdq0vO9978vcuXPzwQ9+MGPGjMmnP/3prp8vXLgwgwcPzvz587PNNtvk4x//eNrb23PDDTdkjz32yCGHHJIVK1Zk0KBB+d73vpeddtopS5cuzfPPP58PfOADueyyy2r46QCgWIQ7ALBWzz77bKZPn55PfOITefjhh3PHHXfk0ksvzXXXXZfJkyfn8ssvz913350kWbBgQY455pjsuuuuWbp0aRYvXpwf/vCH+eAHP5j9998/X/7yl3PLLbfk4osvzi233FLjTwYAxdJS6wEAAPVpu+22y+tf//pcffXV6d27dxYtWpR58+YlSUaOHJmJEycmSWbPnp0jjzwy3/zmN9PR0ZHrrrsu//f//t985jOfyW233ZZBgwYlSZ5++ukMGTKkVh8HAApLuAMAa1i+fHlGjx6da6+9NgcddFCS6qx6W1tbkmT06NFd7917770zffr09OvXLyNGjMgdd9yRYcOG5cUXX8zOO++ca665Jkkyd+7cvOENb9j6HwYACs7F6QCANVxxxRVZtWpVXv/613e9NnXq1MybNy9z5sxZ7b0zZszI2972tgwdOjRtbW35x3/8x2y//fa57rrrct5552WXXXbJvffemzvuuCNjxozZ2h8FAApPuAMAq2lra8u5556bb3/722lpqS7OmzNnTmbMmJFvfOMb+dSnPpVVq1Z1vX/MmDGZP39+3vjGN+amm27K448/ngMOOCAf/OAHkyT/8i//kjPOOCOPPvpo9t9//5p8JgAoMhenAwBW88EPfjDLli3Lj370oyTJM888k0MOOSSf+tSncuKJJ2bs2LHZZZddcvnll6dXr15Jkqeeeiof/vCHM3/+/Oy11165/fbb88QTT2TbbbfNkiVLsv322+ejH/1ovv71r9fyowFAIQl3AKDLPffck3e/+915+OGHM2zYsPzmN7/JSSedlA984AP5yle+kiRpb2/PIYcckkqlku9///sZNWpU1/Y//OEPc+aZZ2bcuHG5//77M3Xq1HzkIx/J888/n/vvvz8/+tGPMm7cuFp9PAAoJEvlAYAu+++/f+bMmZNhw4bl/PPPz7HHHpuvfOUrXdGeJP369cttt92WvffeO4cffnj+8pe/5MILL8zb3va2XH/99ZkxY0auuOKKnHzyyRk5cmSGDx+eX//615k8eXKOOeaYXHDBBTX8hABQPGbcAYC1evHFF7N48eLstNNO63zPs88+mx133DFXXnllxowZs9pV43/5y19myJAhefOb39z12oMPPpgBAwZk11133aJjB4AyEe4AAABQxyyVBwAAgDom3AEAAKCOCXcAAACoY8IdAAAA6phwBwAAgDom3AEAAKCOCXcAAACoY8IdAAAA6tj/DzndEA+C/R5QAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 154
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-07T01:20:10.881614Z",
     "start_time": "2024-08-07T01:20:10.879565Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "1c0463ce7c70cd6e",
   "outputs": [],
   "execution_count": null
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
